﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;

namespace hse_2013_twinpics
{
    public partial class MainForm : Form
    {
        int AnimIndF1 = -1;
        int AnimIndT1 = 2;
        int AnimIndF2 = -1;
        int AnimIndT2 = 2;
        double AnimStage = 1;
        private Image[] Immas; // Массив для лицевых картинок

        const int FieldSize=4;  // Размер поля для игры, просьба не менять, значение не влияет на размер формы
        
        private Elementpic[,] ElementPics;   // Массив карточек на поле

        PictureBox Anim;

        int CountOpenPic = 0; //Количество открытых карточек на поле в текущий момент

        int[] mixindex1 = new int[16];   //массив перемешанных индексов для перемешивания ссылок на картинки

        private void Pic_Click(object sender, EventArgs e) //Метод обработки клика на карточку
        {
            Elementpic element = (Elementpic)sender;
            if (!element.IsOpen)  //Если карточка закрыта
            {
                StartAnim(element.PicIndex, -1, element.Location.X, element.Location.Y);
                Elementpic.Open(element, Immas); //Открыть карточку
                CountOpenPic++;    //Увеличить счсетчик открытых карточек
                if (CountOpenPic == 2) //Если 2 карточки открыты ищем пару
                {
                    //Thread.Sleep(1000);
                    for (int i = 0; i < FieldSize; i++)
                        for (int j = 0; j < FieldSize; j++)
                        {
                            if ((ElementPics[i, j].IsOpen) && (ElementPics[i, j] != element))
                                if ((Elementpic.Compare(ElementPics[i, j], element))) //пара найдена, убираем ее с поля
                                {
                                    ElementPics[i, j].Visible = false;
                                    ElementPics[i, j].Enabled = false;
                                    ElementPics[i, j].IsOpen = false;
                                    element.Visible = false;
                                    element.Enabled = false;
                                    element.IsOpen = false;
                                    CountOpenPic -= 2;
                                }
                                else  //открытые карточки непарные, закрываем
                                {
                                    Elementpic.Close(element, Properties.Resources.cover);
                                    Elementpic.Close(ElementPics[i, j], Properties.Resources.cover);
                                    CountOpenPic -= 2;
                                }
                        }
                }
            }
            else  //пользователь нажал на уже открытую карточку, закрываем ее
            {
                Elementpic.Close(element, Properties.Resources.cover);
                CountOpenPic--;
            }
            /*
             * Здесь вся обработка свойств, переворачивание, сравнивание - ссылки на методы в элементпик
             */
        }

        void StartAnim(int f, int t,int x,int y)
        {
            Anim.Visible = false;
            Anim.Location = new Point(x, y);

            Anim.Invalidate();
            Anim.Refresh();
            AnimStage = 0;
            AnimIndF1 = f;
            AnimIndT1 = t;

            TimerAnimTick_Tick(null, null);

            Invalidate();
            Refresh();
            
        }

        public void MixImage() //Метод перемешивания картинок в массиве Immas
        {
            int[] mixindex = new int[8]; //массив перемешанных индексов для произвольного порядка картинок
            Random rand = new Random();
            int randi1, randi2, buf;

            for (int i = 0; i < 8; i++) //Заполняем массив чисоами по порядку
            {
                mixindex[i] = i;
            }
            for (int k = 0; k < 50; k++) //тасуем пары элементов массива
            {
                randi1 = rand.Next(0, 7);
                randi2 = rand.Next(0, 7);
                buf = mixindex[randi1];
                mixindex[randi1] = mixindex[randi2];
                mixindex[randi2] = buf;
            }

            Immas = new Image[FieldSize * FieldSize / 2];
            //Заполняем массив картинками
            Immas[mixindex[0]] = Properties.Resources.p0;
            Immas[mixindex[1]] = Properties.Resources.p1;
            Immas[mixindex[2]] = Properties.Resources.p2;
            Immas[mixindex[3]] = Properties.Resources.p3;
            Immas[mixindex[4]] = Properties.Resources.p4;
            Immas[mixindex[5]] = Properties.Resources.p5;
            Immas[mixindex[6]] = Properties.Resources.p6;
            Immas[mixindex[7]] = Properties.Resources.p7;

            for (int k = 0; k < 16; k++)    //заполнение массива 0,1,..,6,7,0,...,7
            {
                mixindex1[k] = k % 8;
            }
            for (int k = 0; k < 50; k++)        //перетасовка элементов массива
            {
                randi1 = rand.Next(0, 16);
                randi2 = rand.Next(0, 16);
                buf = mixindex1[randi1];
                mixindex1[randi1] = mixindex1[randi2];
                mixindex1[randi2] = buf;
            }

        }

        public void PicGen()   //Создание и вывод карточек
        {
            Anim = new PictureBox();
            ((System.ComponentModel.ISupportInitialize)(this.Anim)).BeginInit();
            Anim.Image = Properties.Resources.cover;
            Anim.Location = new Point(0,0);
            Anim.Name = "Im";
            Anim.Size = new Size(Properties.Resources.p0.Size.Width, Properties.Resources.p0.Size.Height);
            Anim.TabIndex = 0;
            Anim.TabStop = false;
            ((System.ComponentModel.ISupportInitialize)(this.Anim)).EndInit();
            this.Controls.Add(Anim);
            Anim.Visible = false;

            ElementPics = new Elementpic[FieldSize, FieldSize];
            for (int i = 0; i < FieldSize; i++)
                for (int j = 0; j < FieldSize; j++)
                {   // создаем очередную картинку, определяем ее свойства и добавляем на форму
                    ElementPics[i, j] = new Elementpic(i * FieldSize + j);
                    ((System.ComponentModel.ISupportInitialize)(this.ElementPics[i, j])).BeginInit();
                    ElementPics[i, j].Image = Properties.Resources.cover;
                    ElementPics[i, j].Location = new Point(i * (Properties.Resources.p0.Size.Height)+10*i+10, j * (Properties.Resources.p0.Size.Width) + 10*j+55);
                    ElementPics[i, j].Name = "Im" + i.ToString() + j.ToString();
                    ElementPics[i, j].Size = new Size(Properties.Resources.p0.Size.Width, Properties.Resources.p0.Size.Height);
                    ElementPics[i, j].TabIndex = 0;
                    ElementPics[i, j].TabStop = false;
                    ElementPics[i, j].Click += new EventHandler(Pic_Click);
                    ElementPics[i, j].PicIndex = mixindex1[i * FieldSize + j];
                    ((System.ComponentModel.ISupportInitialize)(this.ElementPics[i, j])).EndInit();
                    this.Controls.Add(ElementPics[i, j]);
                }
        }

        public MainForm()
        {
            InitializeComponent();
            MixImage();  //смешать изображения
            PicGen();   //создать и вывести картинки
        }

        public void NewGame() 
        {
            for (int i = 0; i < FieldSize; i++)
                for (int j = 0; j < FieldSize; j++)
                {
                    Elementpic.Close(ElementPics[i, j], Properties.Resources.cover);
                    ElementPics[i, j].Visible = true;
                    ElementPics[i, j].Enabled = true;
                }
            foreach (Control element in this.Controls)
            {
                if (element is Elementpic)
                {

                }
            }
            CountOpenPic = 0;
            MixImage();
            for (int i = 0; i < FieldSize; i++)
                for (int j = 0; j < FieldSize; j++)
                {
                    ElementPics[i, j].PicIndex = mixindex1[i * FieldSize + j];
                }
        }


       // private void новаяИграToolStripMenuItem_Click(object sender, EventArgs e)
     //   {
          /*  for (int i = 0; i < FieldSize; i++)
                for (int j = 0; j < FieldSize; j++)
                {
                    Elementpic.Close(ElementPics[i, j], Properties.Resources.cover);
                    ElementPics[i, j].Visible = true;
                    ElementPics[i, j].Enabled = true;
                }
            foreach (Control element in this.Controls)
            {
                if (element is Elementpic)
                {

                }
            }
            CountOpenPic = 0;
            MixImage();
            for (int i=0;i<FieldSize;i++)
                for (int j = 0; j < FieldSize; j++)
                {
                    ElementPics[i, j].PicIndex = mixindex1[i * FieldSize + j]; 
                }*/
       // }

        private void MainForm_Load(object sender, EventArgs e)
        {
            this.BackgroundImage = Properties.Resources.background1;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            MenuForm MenuForm = new MenuForm(this);
            MenuForm.ShowDialog();
        }

        Bitmap bf;
        Bitmap bt;
        private void TimerAnimTick_Tick(object sender, EventArgs e)
        {
            AnimStage += 0.05;
            if (AnimStage <= 1)
            {
                Bitmap b = (Bitmap)Anim.Image;
                if (AnimIndF1 < 0) bf = (Bitmap)Properties.Resources.cover; else bf = (Bitmap)Immas[AnimIndF1];
                if (AnimIndT1 < 0) bt = (Bitmap)Properties.Resources.cover; else bt= (Bitmap)Immas[AnimIndT1];


                for (int i = 0; i < 128; i++)
                    for (int j = 0; j < 128; j++)
                    {
                        double jj = (double)j / 128;
                        double ii = (double)i / 128;

                        if (jj+ii*ii < AnimStage*2)
                        {
                            b.SetPixel(i, j, bf.GetPixel(i, j));
                        }
                        else
                        {
                            b.SetPixel(i, j, bt.GetPixel(i, j));
                        }

                    }
                Anim.Image = b;
                Anim.Visible = true;
            }
            else Anim.Visible = false;
        }



    }
}
